/*  -------------------------- (C) COPYRIGHT 2020 Fortiortech ShenZhen ---------------------------*/
/*  File Name      : Protect.h
/*  Author         : Fortiortech  Appliction Team
/*  Version        : V1.0
/*  Date           : 2021-11-07
/*  Description    : 主要用于电机运行保护条件参数设置.
/*  ----------------------------------------------------------------------------------------------*/
/*                                     All Rights Reserved
/*  ----------------------------------------------------------------------------------------------*/

/*  Define to prevent recursive inclusion --------------------------------------------------------*/
#ifndef __PROTECT_H_
#define __PROTECT_H_

/*硬件过流保护*/
 #define Hardware_FO_Protect            (1)                                     // 硬件FO过流保护使能，适用于IPM有FO保护的场合
 #define Hardware_CMP_Protect           (2)                                     // 硬件CMP比较过流保护使能，适用于MOS管应用场合
 #define Hardware_FO_CMP_Protect        (3)                                     // 硬件CMP比较和FO过流保护都使能
 #define Hardware_Protect_Disable       (4)                                     // 硬件过流保护禁止，用于测试
 #define HardwareCurrent_Protect        (Hardware_FO_CMP_Protect) //(Hardware_FO_CMP_Protect)              	// 硬件过流保护实现方式
 /*硬件过流保护比较值来源---------------------------------------------------------------------*/
 #define Compare_Mode                   (Compare_DAC)                      		// 硬件过流值的来源
 /*硬件过流保护*/
 #define OverHardcurrentValue           (25.0)                                	// (A) DAC模式下的硬件过流值
 /*软件过流保护*/
 #define OverSoftCurrentValue           I_Value(10.0)   //18                        // (A) 软件过流值
 /*过流恢复*/
 #define CurrentRecoverEnable           (1)                                     // 过流保护使能位, 0，不使能；1，使能
 #define OverCurrentRecoverTime         (2500)                                   // (5ms) 过流保护恢复时间
 #define OverCurrentRecoverTimes        (5)                                    //  电压保护重启次数 >256为无限恢复
/*------------------------------------------------------------------------*/


 /*过欠压保护------------------------------------------------------------------------*/
 #define VoltageProtectEnable           (1)                                     // 电压保护，0,不使能；1，使能
 #define Over_Protect_Voltage           (370.0)                                  // (V) 直流电压过压保护值		交流240V
 #define Over_Recover_Vlotage           (355.0)                                  // (V) 直流电压过压保护恢复值
 #define Under_Protect_Voltage          (212.0)                                 	// (V) 直流电压欠压保护值
 #define Under_Recover_Vlotage          (250.0)                                   // (V) 直流电压欠压保护恢复值
  /*电压保护恢复*/
 #define VlotageRecoverEnable           (1)                                     // 电压保护恢复使能位, 0，不使能；1，使能
 #define VlotageRecoverTime             (100)                                   // (5ms) 过流保护恢复时间
 #define VlotageRecoverTimes            (5)                                    //  电压保护重启次数 >256为无限次数恢复
/*------------------------------------------------------------------------*/

 /*启动保护------------------------------------------------------------------------*/
 #define StartProtectEnable             (1)                                     // 启动保护，0,不使能；1，使能
 #define StartRecoverEnable             (1)                                     // 启动保护恢复使能位, 0，不使能；1，使能 
 #define StartRecoverTime               (1000)                                   // (5ms) 启动保护恢复时间
 #define StartProtectRestartTimes       (5)                                     // 启动保护重启次数 >256为无限次数恢复

/*------------------------------------------------------------------------*/
 /*堵转保护------------------------------------------------------------------------*/
 #define StallProtectEnable             (1)                                     // 堵转保护，0,不使能；1，使能
 #define MOTOR_SPEED_STAL_MAX_RPM       (700.0)                                // (RPM) 堵转保护最大转速
 #define MOTOR_SPEED_STAL_MIN_RPM       (10.0)                                 // (RPM) 堵转保护最小转速
 #define StallRecoverEnable             (1)                                     // 堵转保护恢复使能位, 0，不使能；1，使能 
 #define StallRecoverTime               (1000)                                  // (5ms) 堵转保护恢复时间
 #define StallProtectRestartTimes       (5)                                     // 堵转保护重启次数 >256为无限次数恢复
/*------------------------------------------------------------------------*/

 /*缺相保护------------------------------------------------------------------------*/
 #define PhaseLossProtectEnable         (1)                                     // 缺相保护，0,不使能；1，使能
 #define PhaseLossCurrentValue          I_Value(0.1)                            // (A)  缺相电流值
 #define PhaseLossRecoverEnable         (1)                                     // 缺相保护恢复使能位, 0，不使能；1，使能  
 #define PhaseLossRecoverTime           (200)                                   // (5ms) 缺相保护时间
 #define PhaseLossRestartTimes       		(5)                                     // 缺相保护重启次数 >256为无限次数恢复
/*------------------------------------------------------------------------*/


/*Mos温度保护*/
 #define Mos_TemperatureProtectEnable       (1)										// MOS温度保护使能： 1——使能  0——禁止																				
// #define Tempera_Value(IPM_TP_Value) 		    _Q15((IPM_TP_Value+20)/40/HW_ADC_REF)
 #define Tempera_Value(IPM_TP_Value) 		_Q15((IPM_TP_Value+20.0)/40.0/HW_ADC_REF)
 #define OVER_Mos_Temperature 		   				Tempera_Value(110.0)						// MOS过温保护阈值，根据NTC曲线设置
 #define UNDER_Mos_Temperature              Tempera_Value(95.0)					    // MOS过温保护恢复阈值，根据NTC曲线设置 IPM输出电压
 #define Over_Mos_TemperRecoverTime	        (1000)				                    // MOS过温恢复时间




/* Exported types ------------------------------------------------------------*/
typedef enum
{
    FaultNoSource      = 0,                                                     // 无故障
    FaultHardOVCurrent = 1,                                                     // 硬件过流
    FaultSoftOVCurrent = 2,                                                     // 软件过流
    FaultUnderVoltage  = 3,                                                     // 欠压保护
    FaultOverVoltage   = 4,                                                     // 过压保护
    FaultLossPhase     = 5,                                                     // 缺相保护
    FaultStall         = 6,                                                     // 堵转保护
    FaultStart         = 7,                                                     // 启动保护
    FaultOverwind      = 8,                                                     // 顺逆风失败保护
    FaultPFC           = 9,                                                     // PFC
    FaultTSD           = 10,
    FaultPFCOffset     = 11,                                                    //PFC偏置错误
		FaultMosOverTemperature = 12 ,                                              //MOS 过热
} FaultStateType;


typedef struct
{
    //Current protect
    uint8  OverCurCnt;                                                          // 软件过流计数

    uint16 Abs_ia;                                                              // IA的绝对值
    uint16 Abs_ib;                                                              // IB的绝对值
    uint16 Abs_ic;                                                              // IC的绝对值

    uint16 Max_ia;                                                              // IA的最大值
    uint16 Max_ib;                                                              // IB的最大值
    uint16 Max_ic;                                                              // IC的最大值
}CurrentVarible;
typedef struct
{
	uint16 VoltRecoverTimes;                                                      // 过压恢复次数计数
    uint16 SecondStartTimes;                                                    // 二次启动保护的次数
    uint16 StallTimes;                                                          // 堵转保护次数
    uint16 LossPHTimes;                                                         // 缺相保护次数
    uint16 CurrentPretectTimes;                                                 // 过流保护次数
    uint8  StartFlag;                                                           // 启动保护的标志位，用于判断哪个方法起作用
    uint8  StallFlag;                                                           // 堵转保护的标志位，用于判断哪个方法起作用
}ProtectVarible;

typedef struct
{
    uint16 segment;                                                             // 分段执行

    //voltage protect
    uint16 OverVoltDetecCnt;                                                    // 过压检测计数
    uint16 UnderVoltDetecCnt;                                                   // 欠压检测计数
    uint16 VoltRecoverCnt;                                                      // 过压恢复计数
	
    //OVER Current protect recover
    uint16 CurrentRecoverCnt;                                                   // 过流保护恢复计数

    //stall protect
    uint16 StallDelayCnt;                                                       // 堵转延迟判断计时
    uint16 StallDectEs;                                                         // method 1，与ES相关
    uint16 StallDectSpeed;                                                      // method 2，与速度相关
    uint16 StallDectESSpeed;                                                    // method 3，与ES和速度相关
    uint16 StallReCount;                                                        // 堵转保护恢复计数
    uint16 StallSpeedAndEsCnt;

    //Loss Phase protect
    uint16 Lphasecnt;                                                           // 缺相保护计时
    uint16 AOpencnt ;                                                           // A缺相计数
    uint16 BOpencnt ;                                                           // B缺相计数
    uint16 COpencnt ;                                                           // C缺相计数
    uint16 mcLossPHRecCount;                                                    // 缺相恢复计数
    
	//Temper protect
	uint16       MosTemperCnt;         // Mos温度判断计数
	uint16       MosTemperRecover;     // Mos温度恢复判断计数
	
	//start protect
    uint16 StartESCount;                                                         // 启动保护判断ES的计数
    uint16 StartEsCnt;                                                           // 启动保护判断ES的计时
    uint16 StartDelay;                                                           // 启动保护判断ES的延迟
    uint16 StartFocmode;                                                         // 启动保护判断FOCMODE状态的计时
    uint16 StartSpeedCnt;                                                        // 启动保护判断速度和ES的计时
    uint16 StartSpeedAndEsCnt;
    uint16 StartReTime;
}FaultVarible;
/* Exported functions ---------------------------------------------------------------------------*/
extern FaultVarible  xdata mcFaultDect;
extern CurrentVarible xdata mcCurVarible;
extern ProtectVarible xdata mcProtectTime;
extern FaultStateType xdata mcFaultSource;

extern void   Fault_OverUnderVoltage(void);
extern void   Fault_Overcurrent(void);
extern void   Fault_OverCurrentRecover(void);
extern void   Fault_Stall(void);
extern void   Fault_phaseloss(void);
extern void   FaultProcess(void);
extern void   Fault_Detection(void);
extern void	  Fault_MosTemperature(void);
#endif

